# LeetCode 7、整数反转

# 一、题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

  • -2^31 <= x <= 2^31 - 1

# 二、题目解析

# 三、参考代码

# 1、Java 代码

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 微信:wzb_3377
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 整数反转(LeetCode 7):https://leetcode.cn/problems/reverse-integer/
class Solution {
    public int reverse(int x) {

        // 记录反转成功之后的结果
        int res = 0;

        // 对于需要反转的数字 x
        // 每一次都按照【从后向前】的顺序去访问每个元素
        // 在访问过程中会执行一些逻辑判断
        // 判断过程中可能会由于越界直接返回 0 
        // 否则会一直判断下去,直到 x 的每个元素均被访问,即 x = 0 时跳出循环
        while( x != 0 ) {

            // 每一次都先获取末尾数字
            int lastNum = x % 10;

            // 假设有 1147483649 这个数字,它是小于最大的 32 位整数 2147483647 的
            // 但是将这个数字反转过来后就变成了 9463847411 ,超过了最大的 32 位整数
            // 根据题目要求需要返回 0

            // 在获取到 lastNum 的过程中,需要判断一下当前的 res 是否合法
            // 如果不合法,就不用再添加 lastNum,结果直接返回 0 就行

            // 1、res 为正数并且大于了 214748364 ,即最小为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
            // 比如 lastNum 最小为 0 ,形成了 2147483650 ,也是大于 2147483647
            // 2、res 等于了 214748364 ,那么在它的后面添加 8、9,就会形成 2147483648 、2147483649 这两个数
            // 而这两个数都不合法,返回 0
            if (res > 214748364 || ( res == 214748364 && (lastNum == 8 || lastNum == 9 ))) {
                // 返回 0
                return 0;

            }
            // 3、res 为负数并且小于了 -214748364 ,即最大为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
            // 比如 lastNum 最小为 9 ,形成了 -2147483650 ,也是小于 -2147483648
            // 4、res 等于了 -214748364 ,那么在它的后面添加 9,就会形成 -2147483649 这个数
            // 而这个数不合法,返回 0
            if (res < -214748364 || (res == -214748364 && lastNum == -9 )) {
                // 返回 0
                return 0;

            }

            // 5、否则说明可以继续添加
            // res 全部元素向左移动,即 10
            res = res  10 + lastNum;

            // 6、在去获取 x 的下一个数
            x /= 10;

        }

        // 返回结果
        return res;
    }
}

# 2、C++ 代码

class Solution {
public:
    int reverse(int x) {
        // 记录反转成功之后的结果
        int res = 0;

        // 对于需要反转的数字 x
        // 每一次都按照【从后向前】的顺序去访问每个元素
        // 在访问过程中会执行一些逻辑判断
        // 判断过程中可能会由于越界直接返回 0 
        // 否则会一直判断下去,直到 x 的每个元素均被访问,即 x = 0 时跳出循环
        while( x != 0 ) {

            // 每一次都先获取末尾数字
            int lastNum = x % 10;

            // 假设有 1147483649 这个数字,它是小于最大的 32 位整数 2147483647 的
            // 但是将这个数字反转过来后就变成了 9463847411 ,超过了最大的 32 位整数
            // 根据题目要求需要返回 0

            // 在获取到 lastNum 的过程中,需要判断一下当前的 res 是否合法
            // 如果不合法,就不用再添加 lastNum,结果直接返回 0 就行

            // 1、res 为正数并且大于了 214748364 ,即最小为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
            // 比如 lastNum 最小为 0 ,形成了 2147483650 ,也是大于 2147483647
            // 2、res 等于了 214748364 ,那么在它的后面添加 8、9,就会形成 2147483648 、2147483649 这两个数
            // 而这两个数都不合法,返回 0
            if (res > 214748364 || ( res == 214748364 && (lastNum == 8 || lastNum == 9 ))) {
                // 返回 0
                return 0;

            }
            // 3、res 为负数并且小于了 -214748364 ,即最大为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
            // 比如 lastNum 最小为 9 ,形成了 -2147483650 ,也是小于 -2147483648
            // 4、res 等于了 -214748364 ,那么在它的后面添加 9,就会形成 -2147483649 这个数
            // 而这个数不合法,返回 0
            if (res < -214748364 || (res == -214748364 && lastNum == -9 )) {
                // 返回 0
                return 0;

            }

            // 5、否则说明可以继续添加
            // res 全部元素向左移动,即 10
            res = res  10 + lastNum;

            // 6、在去获取 x 的下一个数
            x /= 10;

        }

        // 返回结果
        return res;

    }
};

# 3、Python 代码

class Solution:
    def reverse(self, x: int) -> int:
        # 记录反转成功之后的结果
        res = 0

        # 对于需要反转的数字 x
        # 每一次都按照【从后向前】的顺序去访问每个元素
        # 在访问过程中会执行一些逻辑判断
        # 判断过程中可能会由于越界直接返回 0 
        # 否则会一直判断下去,直到 x 的每个元素均被访问,即 x = 0 时跳出循环
        while x != 0 :

            # 每一次都先获取末尾数字
            lastNum = x % 10

            # Python3 的取模运算在 x 为负数时也会返回 [0, 9) 以内的结果,因此这里需要进行特殊判断
            if x < 0 and lastNum > 0:
               lastNum -= 10

            # 假设有 1147483649 这个数字,它是小于最大的 32 位整数 2147483647 的
            # 但是将这个数字反转过来后就变成了 9463847411 ,超过了最大的 32 位整数
            # 根据题目要求需要返回 0

            # 在获取到 lastNum 的过程中,需要判断一下当前的 res 是否合法
            # 如果不合法,就不用再添加 lastNum,结果直接返回 0 就行

            # 1、res 为正数并且大于了 214748364 ,即最小为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
            # 比如 lastNum 最小为 0 ,形成了 2147483650 ,也是大于 2147483647
            # 2、res 等于了 214748364 ,那么在它的后面添加 8、9,就会形成 2147483648 、2147483649 这两个数
            # 而这两个数都不合法,返回 0
            if res > 214748364 or ( res == 214748364 and (lastNum == 8 or lastNum == 9 )) :
                # 返回 0
                return 0

            
            # 3、res 为负数并且小于了 -214748364 ,即最大为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
            # 比如 lastNum 最小为 9 ,形成了 -2147483650 ,也是小于 -2147483648
            # 4、res 等于了 -214748364 ,那么在它的后面添加 9,就会形成 -2147483649 这个数
            # 而这个数不合法,返回 0
            if res < -214748364 or (res == -214748364 and lastNum == -9 ) : 
                # 返回 0
                return 0

        

            # 5、否则说明可以继续添加
            # res 全部元素向左移动,即 10
            res = res  10 + lastNum

            # 6、在去获取 x 的下一个数
            # Python3 的整数除法在 x 为负数时会向下(更小的负数)取整,因此不能写成 x //= 10
            x = (x - lastNum) // 10

        # 返回结果
        return res